From b9e2107336829e418b02c6fb278a02dbee40f563 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 22 Mar 2005 09:38:46 +0000 Subject: [PATCH] bitkeeper revision 1.1236.1.107 (423fe7a68FOsyuQeKM4k2_0KKlkoEg) Calling alloc_boot_pages() after end_boot_allocator() can result in double allocation of the same page. Signed-off-by: Chengyuan Li Signed-off-by: Arun Sharma Signed-off-by: Keir Fraser --- xen/arch/x86/x86_64/mm.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 68f79f77cc..d0717bfab7 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -28,12 +28,26 @@ #include #include -void *safe_page_alloc(void) +static void *safe_page_alloc(void) { extern int early_boot; if ( early_boot ) - return __va(alloc_boot_pages(PAGE_SIZE, PAGE_SIZE)); - return (void *)alloc_xenheap_page(); + { + unsigned long p = alloc_boot_pages(PAGE_SIZE, PAGE_SIZE); + if ( p == 0 ) + goto oom; + return phys_to_virt(p); + } + else + { + struct pfn_info *pg = alloc_domheap_page(NULL); + if ( pg == NULL ) + goto oom; + return page_to_virt(pg); + } + oom: + panic("Out of memory"); + return NULL; } /* Map physical byte range (@p, @p+@s) at virt address @v in pagetable @pt. */ @@ -118,6 +132,7 @@ void __init paging_init(void) { unsigned long i, p, max; l3_pgentry_t *l3rw, *l3ro; + struct pfn_info *pg; /* Map all of physical memory. */ max = ((max_page + L1_PAGETABLE_ENTRIES - 1) & @@ -130,10 +145,11 @@ void __init paging_init(void) */ for ( i = 0; i < max_page; i += ((1UL << L2_PAGETABLE_SHIFT) / 8) ) { - p = alloc_boot_pages(1UL << L2_PAGETABLE_SHIFT, - 1UL << L2_PAGETABLE_SHIFT); - if ( p == 0 ) + pg = alloc_domheap_pages( + NULL, L2_PAGETABLE_SHIFT - L1_PAGETABLE_SHIFT); + if ( pg == NULL ) panic("Not enough memory for m2p table\n"); + p = page_to_phys(pg); map_pages(idle_pg_table, RDWR_MPT_VIRT_START + i*8, p, 1UL << L2_PAGETABLE_SHIFT, PAGE_HYPERVISOR | _PAGE_USER); memset((void *)(RDWR_MPT_VIRT_START + i*8), 0x55, -- 2.30.2